const express = require('express');
const path = require('path');
const compression = require('compression');
const history = require('connect-history-api-fallback');
const fs = require('fs');
const app = express();
const port = process.env.PORT || 3000;

// 日志中间件 - 放在最前面
app.use((req, res, next) => {
  next();
});

// 压缩所有响应
app.use(compression());

// 特殊路由处理 - 处理刷新时可能的直接API请求
app.use('/api', (req, res, next) => {
  // API请求直接通过，不走history fallback
  next();
});

// 启用history模式，处理前端路由
app.use(history({
  verbose: true,
  disableDotRule: true,
  // 自定义路由重写规则
  rewrites: [
    // 确保linkedin页面刷新不会404
    { 
      from: /^\/linkedin.*$/, 
      to: function(context) {
        return '/index.html';
      }
    },
    // 处理其他路由
    { 
      from: /^\/.*$/, 
      to: '/index.html'
    }
  ]
}));

// 设置静态资源目录
app.use(express.static(path.join(__dirname, 'dist'), {
  // 1年缓存静态资源，但HTML文件不缓存
  maxAge: '1y',
  setHeaders: (res, path) => {
    if (path.endsWith('.html')) {
      // 不缓存HTML文件
      res.setHeader('Cache-Control', 'no-cache');
    }
  }
}));

// 确保所有GET请求都能正确处理
app.get('*', (req, res) => {
  // 读取HTML文件并添加动态内容
  fs.readFile(path.join(__dirname, 'dist/index.html'), 'utf8', (err, data) => {
    if (err) {
      // console.error('读取index.html失败:', err);
      return res.status(500).send('服务器错误');
    }
    
    // 可以在这里添加动态内容，如初始状态、路由信息等
    // 例如，添加当前路径信息
    const modifiedHtml = data.replace(
      '</head>', 
      `<script>window.__INITIAL_PATH__ = "${req.path}";</script></head>`
    );
    
    res.send(modifiedHtml);
  });
});

// 错误处理中间件
app.use((err, req, res, next) => {
  // console.error('服务器错误:', err);
  res.status(500).send('服务器内部错误');
});

// 启动服务器
app.listen(port, () => {
  console.log(`
====================================================
  前端服务器已启动，地址: http://localhost:${port}
====================================================
  
  📝 服务器配置:
  - 启用了 gzip 压缩
  - 特别优化了linkedin路径的刷新处理
  - 支持 SPA 路由模式
  - 所有路径都重定向到 index.html
  
  🚀 可以通过以下方式测试您的应用:
  1. 直接访问 http://localhost:${port}
  2. 尝试刷新任意页面，如 http://localhost:${port}/linkedin
  
  😎 成功解决了单页应用刷新404问题!
`);
}); 